A Systematic Evaluation of Transient Execution Attacks and Defenses

摘要：
现代处理器使用的转移预测、乱序执行等优化技术对性能很重要。然而，近期包括Spectre和Meltdown在内的瞬时执行攻击的研究表明，异常或分支预测错误可以在处理器微架构状态中留下依赖于秘密数据的踪迹。这个发现引发了更多的Spectre和Meltdown攻击的变体和相应的防御（如微码和软件补丁）。不幸的是，工业界和学术界现在关注寻找针对于一种变体或利用方式的有效防御方法。这是非常有问题的，因为最先进的方式只提供了有限的对剩余的攻击面的见解，和提出的防御的完全性。

这篇文章展示了一个完全的，可扩展的对瞬时执行攻击的系统化。我们的系统化发现了7种新的还没注意或调查过的瞬时执行攻击，包含两种Meltdown变体Meltdown-PK和Meltdown-BR，5种Spectre的训练策略。我们用PoC在3个主流厂家的处理器中评估了这7种攻击。我们的系统化不但完整地展示了攻击面，也对防御方式做了系统化。从这个系统性的评估，我们发现我们仍然可以对已经由补丁防御的系统进行瞬时执行攻击。

1. 简介

过去的处理器性能在工艺的进步和频率的提升中提升，但是物理的极限限制了这种性能提升的方式，为了继续提升性能，处理器制造商转为关注增加核心数量和优化指令流水线。现代处理器使用多级的流水线，使得操作可以在不同流水级或不同的执行单元并行执行。除此之外，很多处理器允许指令乱序执行，这些处理器有一个重排序单元，跟踪这些指令，并最终按序提交，使得在功能上和按序执行没有区别。从直观上看，在按序和乱序流水线上执行的指令，如果依赖于此前没有执行的指令，则不能执行。因此，为了在所有时刻填满流水线，预测控制流、数据相关、甚至是具体的数据非常重要。被清除的指令，即由于回卷，在体系结构层次中结果不会显现出来的指令，称为瞬时指令（transient instructions）。[56][50][84]

虽然瞬时指令在体系结构上的效果和结果被丢弃，微架构的副作用在瞬时执行后仍然存在。这就是Spectre[50], Meltdown[56], Foreshadow[84]的基础。这些攻击利用了瞬时执行，并把秘密在微架构副作用（如高速缓存）中进行编码，把它们传送给（体系结构层次上）攻击者。瞬时执行攻击这个领域突然产生并发展迅速，人们还没有意识到所有的变体和其中的含义。这从混乱的命名方式中就能体现出来，这种命名方式导致了对至少一种攻击分类错误。更重要的是，这种混乱引起了对防御概念上的错误和错误的假设。很多防御，重点关注阻止对特定隐蔽信道的利用，而不是强调微架构上信息泄露的根本原因。[47,45,88,50]其他防御依赖于最新的CPU特性，它们还没有从瞬时执行的角度充分评估。[83]我们同时揭穿一些假设，包括AMD的处理器没有Meltdown类型的攻击，以及串行化指令在所有处理器上都能防御Spectre Variant 1.

在这篇文章中，我们展示了一个对瞬时执行攻击，即Spectre,Meltdown,Foreshadow和相关攻击的完整并可扩展的系统化。用我们的通用决策树，所有已知的瞬时执行攻击可以准确地用一个通用并无歧义的命名方式分类。这种层次化和可扩展的分类方法，可以容易地识别剩下的攻击面，引出7种新的瞬时执行攻击。两种攻击是Meltdown-BR，利用Intel和AMD的bound指令的Meltdown类效果，和Meltdown-PK，利用Intel的内存保护密钥的Meltdown类效果。另外5中是对Spectre-PHT和Spectre-BTB的之前被忽视的训练策略。我们对易受攻击的代码模式进行可行的PoC攻击，并在Intel，ARM，AMD的处理器上对此进行评估。

我们还提供了一个对最先进的防御的系统化。我们基于此系统性地评估这些防御，用可行的实验和理论性的论证，展示哪些可用，哪些不可用。这个系统性的评估表明我们仍然可以对应该已经用放出的补丁防御好的系统进行瞬时执行攻击。最后，我们讨论怎样设计防御用于消除所有类型的瞬时执行攻击。

2. 背景

乱序执行：现代处理器中，一个复杂的指令系统中的指令首先译码为简单的微操作，这个设计允许超标量优化，并通过微码更新扩展或修改某些指令的实现。为了提升性能，CPU通常实现乱序执行，这允许处理器不但可以按照指令流提供的顺序执行uOP，还能并行分发这些指令，尽量利用CPU的执行单元，提高总体性能。如果uOP的操作数可用，并且对应的执行单元空闲，则处理器开始执行，即使指令流中更早的uOP还没完成。由于在此前所有uOP执行完成，结果才能在体系结构中可见，CPU通常用重排序缓冲（ROB）跟踪这些uOP的状态。当uOP完成执行后，它们按序retire，结果提交到体系结构状态。uOP执行过程中的异常和中断在retire的过程中处理。因此，CPU可能会执行结果从未提交至体系结构状态的指令。这些指令称为瞬时指令。[56]

推测式执行：复杂的软件包含了分支和指令间数据依赖。理论上，处理器需要暂停，直到分支或数据依赖解决才能继续执行。由于暂停导致性能显著降低，处理器使用多种机制预测分支的结果或数据依赖。从而处理器在预测的路径继续执行，把结果存在ROB中，直到依赖解决时，预测的正确性被验证。在正确的预测时，处理器可以从ROB retire预计算的结果，提高总体性能。然而，如果预测错误，处理器需要squash预计算的结果，通过清空流水线和ROB回卷到上一个正确的状态。从而处理器也执行了瞬时指令，它们没有提交到体系结构状态。

瞬时执行攻击：尽管执行瞬时指令不影响体系结构状态，不能在体系结构的层次上观测，微架构的状态会改变。瞬时执行攻击利用这些微架构状态的改变，通过把微架构状态转换为体系结构状态，提取敏感信息。通常，这些攻击使用CPU的缓存，因为这些状态可以很容易地观测到。然而，瞬时执行攻击不只限于缓存，任何可改变并可观测的微架构状态都可以使用。

2.1 缓存隐蔽信道

现代CPU使用缓存隐藏存储延迟。然而，这些延迟的不同可以从侧信道和隐蔽信道利用[51,66,89,26,61]. Flush+Reload允许在缓存行的粒度跨核观测，攻击密码学算法[89,44,27]，用户输入[26,55,71]，和内核地址信息[23].Flush+Reload中，攻击者连续地用clflush清除数据，并重新装载数据。如果受害者使用了这个缓存行，访问速度快，否则速度慢。

隐蔽信道时侧信道攻击的一个特殊用途，攻击者同时控制了发送者和接收者，这允许了攻击者越过所有体系结构层次的限制来泄露信息。缓存攻击的发送者可以用很少代码实现[57,61,24],如``tmp = array[secret * 4096]``,这样的代码会在真实软件中频繁出现。在这篇文章中，我们关注使用隐蔽信道进行瞬时执行攻击，从瞬时执行传送数据至持久的体系结构状态。

2.2 Spectre和Meltdown的不同

在讨论Spectre型和Meltdown型攻击之前，我们精确地描述它们，作为我们分类树的第一层。“推测式执行”经常错误地指代对一种特定事件，乱序执行，流水线的推测。这种混乱被加强，认为在很多Meltdown型和Spectre型攻击中，编码并传送秘密数据至体系结构状态的方法（如Flush+Reload隐蔽信道）是相同的。然而，Spectre和Meltdown利用CPU的不同特性，它们共同的特性只是两种攻击都利用瞬时执行的副作用。因此，更准确的词语是 **瞬时执行**，精确地描述共同根本的效果。

对于Spectre，瞬时指令只对应用可以在体系结构层次访问的数据起作用。瞬时执行的指令在正常的控制流中也可以执行，例如在分支条件不同的时候。注意到尽管Spectre-BTB可以跳到当前地址空间的任意位置，它仍然对应用在体系结构层次可访问的数据起作用。

对于Meltdown，瞬时指令对应用在体系结构层次上不可访问的数据起作用。在通常的控制流中，应用从来不能访问这个数据。因此，Meltdown利用的是在错误之后的瞬时指令可以访问错误指令的数据。

图2展示Meltdown和Spectre的区别，Meltdown需要错误之后的瞬时执行，但它不足以形成Meltdown.把错误指令的数据用一个空值代替（如AMD的处理器中的Meltdown-US）足够在硬件中消除Meltdown.

当前Meltdown型攻击利用乱序执行，按序执行的流水线也同样允许类似的攻击。因此，Meltdown型攻击和Spectre型攻击的分类不同，这点在讨论这些攻击的防御的时候能更清楚地看到。


[50] SP2019, Spectre
[56] USENIX Security 2018, Meltdown
[84] USENIX Security 2018, Foreshadow
[48] Speculative Buffer Overflows, arXiv:1807.03757

[47] DAWG
[45] SafeSpec
[88] InvisiSpec

[83] secure and efficient in-process isolation with
memory protection keys. arXiv:1801.06822

[51] K OCHER , P. C. Timing Attacks on Implementations of Diffe-Hellman, RSA, DSS, and Other Systems. In CRYPTO (1996).
[66] O SVIK , D. A., S HAMIR , A., AND T ROMER , E. Cache Attacks and Countermeasures: the Case of AES. In CT-RSA (2006).
[89] Y AROM , Y., AND F ALKNER , K. Flush+Reload: a High Resolution, Low Noise, L3 Cache Side-Channel Attack. In USENIX Security Symposium (2014).
[26] G RUSS , D., S PREITZER , R., AND M ANGARD , S. Cache Template Attacks: Automating Attacks on Inclusive Last-Level Caches. In USENIX Security Symposium (2015).
[61] M AURICE , C., W EBER , M., S CHWARZ , M., G INER , L., G RUSS , D., A LBERTO B OANO , C., M ANGARD , S., AND R ÖMER , K. Hello from the Other Side: SSH over Robust Cache Covert Channels in the Cloud. In NDSS (2017).

[57] L IU , F., Y AROM , Y., G E , Q., H EISER , G., AND L EE , R. B. Last-Level Cache Side-Channel Attacks are Practical. In S&P (2015).
[24] G RUSS , D., M AURICE , C., W AGNER , K., AND M ANGARD , S. Flush+Flush: A Fast and Stealthy Cache Attack. In DIMVA (2016).
